package it.mercatino.hibernate;

import it.mercatino.catalogo.CatalogoUtil;
import it.mercatino.categorie.CategoriaUtil;
import it.mercatino.composite.ElementoCatalogo;
import it.mercatino.hibernate.Articolo;
import it.mercatino.hibernate.Categoria;

import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

/**
 * Categoria entity. @author MyEclipse Persistence Tools
 */

public class Categoria implements java.io.Serializable, ElementoCatalogo {

	// Fields

	private Integer idCategoria;
	private Categoria categoria;
	private String nome;
	private Set categorias = new HashSet(0);
	private Set articolos = new HashSet(0);
	
	// Pattern Composite
	private List<ElementoCatalogo> children = new LinkedList<ElementoCatalogo>();
	
	// Constructors

	/** default constructor */
	public Categoria() {
	}

	/** minimal constructor */
	public Categoria(String nome) {
		this.nome = nome;
	}

	/** full constructor */
	public Categoria(Categoria categoria, String nome, Set categorias,
			Set articolos) {
		this.categoria = categoria;
		this.nome = nome;
		this.categorias = categorias;
		this.articolos = articolos;
	}

	// Property accessors

	public Integer getIdCategoria() {
		return this.idCategoria;
	}

	public void setIdCategoria(Integer idCategoria) {
		this.idCategoria = idCategoria;
	}

	public Categoria getCategoria() {
		return this.categoria;
	}

	public void setCategoria(Categoria categoria) {
		this.categoria = categoria;
	}

	public String getNome() {
		return this.nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public Set getCategorias() {
		return this.categorias;
	}

	public void setCategorias(Set categorias) {
		this.categorias = categorias;
	}

	public Set getArticolos() {
		return this.articolos;
	}

	public void setArticolos(Set articolos) {
		this.articolos = articolos;
	}
	
	/**
	 * @return the children
	 */
	public List<ElementoCatalogo> getChildren() {
		return children;
	}

	/**
	 * @param children the children to set
	 */
	public void setChildren(List<ElementoCatalogo> children) {
		this.children = children;
	}

	@Override
	public void add(ElementoCatalogo e) {
		if (!children.contains(e)) {
			e.setFather(this);
			children.add(e);	
		}
	}

	@Override
	public void remove(ElementoCatalogo e) {
		if (children.contains(e)) {	
			e.setFather(null);
			children.remove(e);	
		}
	}

	@Override
	public ElementoCatalogo getChild(int i) {
		if (i > (children.size() - 1))
			return null;
		else
			return children.get(i);
	}

	@Override
	public ElementoCatalogo getFather() {
		return getCategoria();
	}

	@Override
	public int getNumeroElementi() {
		initChildren();
		int elementi = 0;
		Iterator<ElementoCatalogo> itr = children.iterator();
		while (itr.hasNext()) {
			ElementoCatalogo current = itr.next();
			elementi += current.getNumeroElementi();
		}
		return elementi;
	}

	@Override
	public void setFather(ElementoCatalogo father) {
		setCategoria((Categoria) father);
	}
	
	private void initChildren() {
		if (idCategoria == null || idCategoria == 0 || categoria == null)
			return;
		List<Articolo> artChildren = CatalogoUtil.getInstance().getArticoliCategoria(idCategoria);
		List<Categoria> catChildren = CategoriaUtil.getInstance().getCatChildren(idCategoria);
		
		Iterator<Articolo> aItr = artChildren.iterator();
		while (aItr.hasNext())
			add(aItr.next());
		Iterator<Categoria> cItr = catChildren.iterator();
		while (cItr.hasNext()) {
			Categoria current = cItr.next();
			if (current.getIdCategoria() != getIdCategoria())
				add(current);
		}
	}

	@Override
	public boolean isComposite() {
		return true;
	}
	
	public List<Categoria> getChildrenCategories() {
		
		initChildren();
		List<Categoria> childrenCategories = new LinkedList<Categoria>();
		Iterator<ElementoCatalogo> itr = children.iterator();
		while (itr.hasNext()) {
			ElementoCatalogo current = itr.next();
			if (current.isComposite())
				childrenCategories.add((Categoria)current);
		}
		return childrenCategories;
	}

}